package com.artemzin.qualitymatters.other;

import org.junit.Before;
import org.junit.Test;

import rx.functions.Action0;

import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;

public class DisposableSubscriptionTest {

    private Action0 disposeAction;
    private DisposableSubscription disposableSubscription;

    @Before
    public void beforeEachTest() {
        disposeAction = mock(Action0.class);
        disposableSubscription = new DisposableSubscription(disposeAction);
    }

    @Test
    public void unsubscribed_shouldReturnFalseByDefault() {
        assertThat(disposableSubscription.isUnsubscribed()).isFalse();
        verifyZeroInteractions(disposeAction);
    }

    @Test
    public void unsubscribe_shouldChangeValueOfIsUsubscribed() {
        disposableSubscription.unsubscribe();
        assertThat(disposableSubscription.isUnsubscribed()).isTrue();
    }

    @Test
    public void unsubscribe_shouldCallDisposableAction() {
        disposableSubscription.unsubscribe();
        verify(disposeAction).call();
    }

    @Test
    public void unsubscribeTwice_shouldCallDisposableActionOnce() {
        disposableSubscription.unsubscribe();
        disposableSubscription.unsubscribe();
        verify(disposeAction).call();
    }
}